package com.xgzit.xgzmall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 1、整合mybatis-plus
 * 1）导入依赖
 * 2）配置
 *      1、配置数据源
 *          1）、导入数据库驱动
 *          2）、在applicati.yml配置数据源信息
 *      2、配置mybatis-plus
 *          1）、使用MapperScan （扫描dao层接口）
 *          2）告诉 mybatis-plus，sql映射文件位置
 * 2、使用逻辑删除
 *  1）配置全局逻辑删除规则（可以不配）
 *  2）3.2以下版本需要配置逻辑删除组件Bean
 *  3）在实体类的逻辑删除字段加上注解@
 *
 * 3、校验 JSR303
 * springBoot2.2.6以上版本需要自己引入依赖
 * <dependency>
 *   <groupId>org.springframework.boot</groupId>
 *   <artifactId>spring-boot-starter-validation</artifactId>
 *   <version>2.3.5.RELEASE</version>
 * </dependency>
 *  1)、给Bean添加校验注解，在javax.validation.constrains有
 *  2)、controller里面加上@valid 注解
 *  3)、给校验的bean后紧跟一个BindingResult result
 *  4)、分组校验
 *      1）、给校验注解标注什么情况需要校验 groups
 *      3)、如果分组了，没有写分组的注解将不会生效！
 *  5）、自定义校验
 *      1）、编写自定义校验注解
 *      2）、编写自定义校验器
 *      3）、关联交校验器与注解
 *      @Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
 *      @Retention(RetentionPolicy.RUNTIME)
 *      @Documented
 *      @Constraint(validatedBy = {ListValueConstrainValidator.class})
 * 4、统一异常处理
 *  1）、编写异常处理类 @ControllerAdvice
 *  2）、使用@ExceptionHandler 标注方法处理异常
* */
@EnableRedisHttpSession
@EnableFeignClients(basePackages = "com.xgzit.xgzmall.product.feign")
@EnableDiscoveryClient
@MapperScan("com.xgzit.xgzmall.product.dao")
@SpringBootApplication
public class XgzmallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(XgzmallProductApplication.class, args);
    }

}
